import type { ConfigEnv, UserConfigExport } from 'vite'
import { fileURLToPath } from 'node:url'
import { visualizer } from 'rollup-plugin-visualizer'
import { loadEnv } from 'vite'
import { exclude, include } from './build/optimize'
import { getPluginsList } from './build/plugins'
import { __APP_INFO__, alias, pathResolve, root, wrapperEnv } from './build/utils'

export default ({ mode }: ConfigEnv): UserConfigExport => {
  const { VITE_CDN, VITE_PORT, VITE_COMPRESSION, VITE_PUBLIC_PATH } = wrapperEnv(loadEnv(mode, root))
  return {
    // 项目的根目录
    root,
    // 项目部署的基础路径
    base: VITE_PUBLIC_PATH,
    // 无需处理的静态资源
    publicDir: fileURLToPath(new URL('./public', import.meta.url)),
    // 需要处理的静态资源
    assetsInclude: fileURLToPath(new URL('./src/assets', import.meta.url)),
    // 配置别名
    resolve: { alias },
    // 插件处理
    plugins: getPluginsList(VITE_CDN, VITE_COMPRESSION),
    // 运行后本地预览的服务器
    server: {
      // 端口号
      port: VITE_PORT,
      host: '0.0.0.0',
      // 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy
      proxy: {},
      // 预热文件以提前转换和缓存结果，降低启动期间的初始页面加载时长并防止转换瀑布
      warmup: { clientFiles: ['./index.html', './src/{views,components}/*'] }
    },
    // https://cn.vitejs.dev/config/dep-optimization-options.html#dep-optimization-options
    optimizeDeps: {
      include,
      exclude
    },
    // 打包配置
    build: {
      target: 'es2015',
      // 关闭 sourcemap 报错不会映射到源码
      sourcemap: false,
      // 打包大小警告 单位kb
      chunkSizeWarningLimit: 400,
      rollupOptions: {
        plugins: [visualizer({ open: false })],
        // 记录模块的副作用，防止打包时被tree shaking
        // experimentalLogSideEffects: true,
        treeshake: {
          // 官方推荐 recommended
          preset: 'recommended'
          // propertyReadSideEffects: true
        },
        input: { index: pathResolve('./index.html', import.meta.url) },
        // 静态资源分类打包
        output: {
          chunkFileNames: 'static/js/[name]-[hash].js',
          entryFileNames: 'static/js/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
        }
      }
    },
    define: {
      __INTLIFY_PROD_DEVTOOLS__: false,
      __APP_INFO__: JSON.stringify(__APP_INFO__)
    }
  }
}
